home *** CD-ROM | disk | FTP | other *** search
/ PC PowerPlay 22 / PCPP #22.iso / Quake2 / q2source_12_11 / utils3 / qdata / sprites.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-09-16  |  3.8 KB  |  208 lines

  1.  
  2. #include "qdata.h"
  3.  
  4. #define MAX_SPRFRAMES            MAX_MD2SKINS
  5.  
  6. dsprite_t        sprite;
  7. dsprframe_t        frames[MAX_SPRFRAMES];
  8.  
  9. byte            *byteimage, *lbmpalette;
  10. int                byteimagewidth, byteimageheight;
  11.  
  12. char            spritename[1024];
  13.  
  14.  
  15. void FinishSprite (void);
  16. void Cmd_Spritename (void);
  17.  
  18.  
  19.  
  20. /*
  21. ==============
  22. FinishSprite    
  23. ==============
  24. */
  25. void FinishSprite (void)
  26. {
  27.     FILE    *spriteouthandle;
  28.     int            i, curframe;
  29.     dsprite_t    spritetemp;
  30.     char        savename[1024];
  31.  
  32.     if (sprite.numframes == 0)
  33.         return;
  34.  
  35.     if (!strlen(spritename))
  36.         Error ("Didn't name sprite file");
  37.         
  38.     sprintf (savename, "%s%s.sp2", gamedir, spritename);
  39.  
  40.     if (g_release)
  41.     {
  42.         char    name[1024];
  43.  
  44.         sprintf (name, "%s.sp2", spritename);
  45.         ReleaseFile (name);
  46.         spritename[0] = 0;        // clear for a new sprite
  47.         sprite.numframes = 0;
  48.         return;
  49.     }
  50.  
  51.  
  52.     printf ("saving in %s\n", savename);
  53.     CreatePath (savename);
  54.     spriteouthandle = SafeOpenWrite (savename);
  55.  
  56.  
  57. //
  58. // write out the sprite header
  59. //
  60.     spritetemp.ident = LittleLong (IDSPRITEHEADER);
  61.     spritetemp.version = LittleLong (SPRITE_VERSION);
  62.     spritetemp.numframes = LittleLong (sprite.numframes);
  63.  
  64.     SafeWrite (spriteouthandle, &spritetemp, 12);
  65.  
  66. //
  67. // write out the frames
  68. //
  69.     curframe = 0;
  70.  
  71.     for (i=0 ; i<sprite.numframes ; i++)
  72.     {
  73.         frames[i].width = LittleLong(frames[i].width);
  74.         frames[i].height = LittleLong(frames[i].height);
  75.         frames[i].origin_x = LittleLong(frames[i].origin_x);
  76.         frames[i].origin_y = LittleLong(frames[i].origin_y);
  77.     }
  78.     SafeWrite (spriteouthandle, frames, sizeof(frames[0])*sprite.numframes);
  79.  
  80.     fclose (spriteouthandle);
  81.     
  82.     spritename[0] = 0;        // clear for a new sprite
  83.     sprite.numframes = 0;
  84. }
  85.  
  86.  
  87. /*
  88. ===============
  89. Cmd_Load
  90. ===============
  91. */
  92. void Cmd_Load (void)
  93. {
  94.     char    *name;
  95.  
  96.     GetToken (false);
  97.  
  98.     if (g_release)
  99.         return;
  100.  
  101.     name = ExpandPathAndArchive(token);
  102.  
  103.     // load the image
  104.     printf ("loading %s\n", name);
  105.     Load256Image (name, &byteimage, &lbmpalette, 
  106.         &byteimagewidth, &byteimageheight);
  107.     RemapZero (byteimage, lbmpalette, 
  108.         byteimagewidth, byteimageheight);
  109. }
  110.  
  111.  
  112. /*
  113. ===============
  114. Cmd_SpriteFrame
  115. ===============
  116. */
  117. void Cmd_SpriteFrame (void)
  118. {
  119.     int             y,xl,yl,xh,yh,w,h;
  120.     dsprframe_t        *pframe;
  121.     int                ox, oy;
  122.     byte            *cropped;
  123.     char            savename[1024];
  124.  
  125.     GetToken (false);
  126.     xl = atoi (token);
  127.     GetToken (false);
  128.     yl = atoi (token);
  129.     GetToken (false);
  130.     w = atoi (token);
  131.     GetToken (false);
  132.     h = atoi (token);
  133.  
  134.     // origin offset is optional
  135.     if (TokenAvailable ())
  136.     {
  137.         GetToken (false);
  138.         ox = atoi (token);
  139.         GetToken (false);
  140.         oy = atoi (token);        
  141.     }
  142.     else
  143.     {
  144.         ox = w/2;
  145.         oy = h/2;
  146.     }
  147.  
  148.     if ((xl & 0x07) || (yl & 0x07) || (w & 0x07) || (h & 0x07))
  149.         Error ("Sprite dimensions not multiples of 8\n");
  150.  
  151.     if ((w > 256) || (h > 256))
  152.         Error ("Sprite has a dimension longer than 256");
  153.  
  154.     xh = xl+w;
  155.     yh = yl+h;
  156.  
  157.     if (sprite.numframes >= MAX_SPRFRAMES)
  158.         Error ("Too many frames; increase MAX_SPRFRAMES\n");
  159.  
  160.     pframe = &frames[sprite.numframes];
  161.     pframe->width = w;
  162.     pframe->height = h;
  163.     pframe->origin_x = ox;
  164.     pframe->origin_y = oy;
  165.     sprintf (pframe->name, "%s_%i.pcx", spritename, sprite.numframes);
  166.     sprintf (savename, "%s%s_%i.pcx", gamedir, spritename, sprite.numframes);
  167.     sprite.numframes++;
  168.  
  169.     if (g_release)
  170.     {
  171.         ReleaseFile (pframe->name);
  172.         return;
  173.     }
  174.  
  175.     // crop it to the proper size
  176.     cropped = malloc (w*h);
  177.     for (y=0 ; y<h ; y++)
  178.     {
  179.         memcpy (cropped+y*w, byteimage+(y+yl)*byteimagewidth+xl, w);
  180.     }
  181.  
  182.     // save off the new image
  183.     printf ("saving %s\n", savename);
  184.     CreatePath (savename);
  185.     WritePCXfile (savename, cropped, w,    h, lbmpalette);
  186.  
  187.     free (cropped);
  188. }
  189.  
  190.  
  191.  
  192. /*
  193. ==============
  194. Cmd_SpriteName
  195. ==============
  196. */
  197. void Cmd_SpriteName (void)
  198. {
  199.     if (sprite.numframes)
  200.         FinishSprite ();
  201.  
  202.     GetToken (false);
  203.     strcpy (spritename, token);
  204.     memset (&sprite, 0, sizeof(sprite));
  205.     memset (&frames, 0, sizeof(frames));
  206. }
  207.  
  208.